%{
#define YYSTYPE double
#include "cal_tab.h"
int c;

extern YYSTYPE yylval;
double translate(int type);
void count(void);
void setLastVar(void);
int lookup(int *typeOfObject);
struct lextab *lexswitch(struct lextab *lp);


#define INTCONST 1
#define DBLCONST 2
#define HEXCONST 3
#define VARIABLE 4
#define OTHER    5

%}

digit =     [0-9];
letter =    [a-zA-Z_];
hex =       [a-fA-F0-9];
/* -- */
space           = [\40];
/*number          =  (digit* | "-" digit*);*/
number          = digit*;
exp             = [Ee] number;
doubl           = number "." (digit* | digit* exp);

%%
hex hex* [hH]             { count(); yylval = translate(HEXCONST); return VALUE; }
digit*                    { count(); yylval = translate(INTCONST); return VALUE; }
digit digit* [Dd]         { count(); yylval = translate(INTCONST); return VALUE; }
doubl               	  { count(); yylval = translate(DBLCONST); return VALUE; }
letter*                   { count(); { int typeOfObject; setLastVar(); yylval = lookup(&typeOfObject); return typeOfObject; }}
letter (letter|digit)*    { count(); { int typeOfObject; setLastVar(); yylval = lookup(&typeOfObject); return typeOfObject; }}
'+'			  { count(); return '+'; }
'-'			  { count(); return '-'; }
'*'			  { count(); return '*'; }
'/'			  { count(); return '/'; }
'%'			  { count(); return '%'; }
'&'			  { count(); return '&'; }
'|'			  { count(); return '|'; }
'('			  { count(); return '('; }
')'			  { count(); return ')'; }
'='			  { count(); return '='; }
','                       { count(); return ','; }
';'                       { count(); return ';'; }
[ \t\v\f]		  { count(); }
.               	  { count(); }

%%
